Various types of software development applications exist that software developers may use to develop software. An integrated development environment (IDE) is a type of software development application that contains several development tools in one package. An IDE may include tools such as a source code editor, a build automation tool, and a debugger. Examples of IDEs include Eclipse™ developed by Eclipse Foundation of Ottawa, Canada, ActiveState Komodo™ developed by ActiveState of Vancouver, Canada, IntelliJ IDEA developed by JetBrains of the Czech Republic, Oracle JDeveloper™ developed by Oracle Corporation of Redwood City, Calif., NetBeans developed by Oracle Corporation, Codenvy™ developed by Codenvy of San Francisco, Calif., Xcode® developed by Apple Corporation of Cupertino, Calif., and Microsoft® Visual Studio®, developed by Microsoft Corporation of Redmond, Wash.
Code optimization refers to a method of code modification that improves code quality and/or efficiency. A program may be optimized so that it becomes a smaller size, consumes less memory, executes more rapidly, or performs fewer input/output operations. Code optimization may be performed, for example, by a specialized software tool or a built-in unit of a compiler (a so-called “optimizing compiler”). Code optimization is used in the development of many types of applications, including the development of video games, where developers may generate optimized builds in daily use (primarily for performance reasons). An optimized build results in machine code that is semantically equivalent to machine code generated without optimizations, but is configured in a way that fewer resources are used during execution of the optimized machine code (e.g., less memory, fewer procedure calls, etc.).
As noted above, many developers use optimized build configurations for their daily developer build scenarios. This is a very common practice for game developers, who need their games to run at a particular speed to add visual effects, etc. Due to the introduction of certain optimizations (e.g., inlining, register allocation, common subexpression elimination, etc.), it is common for a developer that is debugging optimized code to observe a hopping program counter (the program counter jumps around in a manner that is not sequential), cross-jumping, the well-known roving variable phenomenon (e.g., a variable might be dead and its register is reused, assignment to a variable has been moved etc.), as well as other undesired phenomenon. Thus, such optimizations can make debugging the optimized code a difficult and frustrating experience for the average developer.